package cn.javabb.log.action;

import cn.javabb.common.utils.EntityBeanUtil;
import cn.javabb.common.utils.RequestUtil;
import cn.javabb.core.entity.sys.LogDO;
import cn.javabb.log.action.base.BaseActionMap;
import cn.javabb.log.action.base.ResetLog;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.Assert;

import javax.persistence.Table;

/**
 * @desc:
 * @author: javabb (javabob(a)163.com)
 * @create: 2019/10/27 00:02
 */
@Slf4j
public class SaveAction extends BaseActionMap {
    @Override
    public void init() {
        // 记录数据保存日志
        putMethod("default","defaultMethod");
    }


    /**
     * 重新包装保存的数据行为方法
     *
     * @param resetLog ResetLog对象数据
     */
    public static void defaultMethod(ResetLog resetLog) {
        LogDO logDO = resetLog.getLog();
        Object entity = resetLog.getEntityParam();
        Assert.notNull(entity, "日志记录失败：未发现@EntityParam注解参数，将不做数据日志记录");

        // 获取实体类的@Table表名
        Table table = entity.getClass().getAnnotation(Table.class);
        Assert.notNull(table, "该对象不存在" + Table.class.getName() + "注解！请检查！");
        logDO.setModel(table.name());

        // 获取实体对象数据ID
        Object[] idInfo = EntityBeanUtil.getId(entity);
        Assert.notNull(idInfo, "无法获取该实体对象的主键ID字段！");
        // 具体要看主键类型
        logDO.setRecordId(String.valueOf(idInfo[1]));

        // 日志消息
        String idParam = RequestUtil.getParameter(String.valueOf(idInfo[0]));
        String message = "数据成功";
        if (!logDO.getMessage().isEmpty()) {
            message = resetLog.fillRule(entity, logDO.getMessage());
        }

        if (idParam == null) {
            logDO.setMessage("添加" + message);
        } else {
            logDO.setMessage("更新" + message);
        }
    }

}
